/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 * <DEC_VARIAVEL> ::= <TIPO> [ ‘[‘ ‘]’  ] <NOME> [ <ATRIBUIR_VALOR> | { ‘,’ <NOME> } ] ‘;’
 */
package compilador.analisadorSintatico.classe;

import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.metodos.ATRIBUIR_VALOR;
import compilador.analisadorSintatico.metodos.VALOR;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import compilador.analisadorSintatico.simboloGramatical.Terminal;

/**
 *
 * @author Matheus CAS
 */
public class DEC_VARIAVEL extends Producao {

    @Override
    public SimboloGramatical derivar() throws Exception {
        //throw new UnsupportedOperationException("Not supported yet.");

        TokenReader tokenReader = TokenReader.getInstance();

        Token token = null;

        NaoTerminal naoTerminal = new NaoTerminal(this.getClass().getSimpleName());

        token = tokenReader.seeCurrent();
        naoTerminal.add(new TIPO().derivar());
        
        token = tokenReader.seeCurrent();
        if (token.getTokenClass().equals(TokenClass.OPERADOR) && token.getAtributo().equals("[")) {

            tokenReader.consome();
            naoTerminal.add(new Terminal(token));
            
            token = tokenReader.seeCurrent();
            if (token.getTokenClass().equals(TokenClass.OPERADOR) && token.getAtributo().equals("]")) {

            tokenReader.consome();
            naoTerminal.add(new Terminal(token));

            } else {
                erro(this.getClass().getSimpleName() + " mal formada - ']' não encontrado");
                return simbolo;
            }
            

        }
        
        naoTerminal.add(new NOME().derivar());


        token = tokenReader.seeCurrent();
        if (token.getTokenClass().equals(TokenClass.DELIMITADOR) && token.getAtributo().equals(";")) {
            
        } else if (token.getTokenClass().equals(TokenClass.OPERADOR) && token.getAtributo().equals("=")) {
            
            naoTerminal.add(new ATRIBUIR_VALOR().derivar());
            
        } else if (token.getTokenClass().equals(TokenClass.OPERADOR) && token.getAtributo().equals(",")){
            while ((token.getTokenClass().equals(TokenClass.OPERADOR)) && (token.getAtributo().equals(",")) && tokenReader.hasToken()) {
                {
                    
                    tokenReader.consome();
                    naoTerminal.add(new Terminal(token));
                    naoTerminal.add(new NOME().derivar());
                    token = tokenReader.seeCurrent();

                }
            }
        }
        
        token = tokenReader.seeCurrent();
        if (token.getTokenClass().equals(TokenClass.DELIMITADOR) && token.getAtributo().equals(";")) {
                tokenReader.consome();
                naoTerminal.add(new Terminal(token));
            } 
        else {
                erro(this.getClass().getSimpleName() + " mal formada");
        }
        
        return naoTerminal;
    }

    @Override
    public void setSimbolo() {
        simbolo = new NaoTerminal(this.getClass().getSimpleName());
    }
}
